//arch.h
#ifndef ARCH_H
#define ARCH_H

#include <string>
#include <vector>
#include <set>
#include "lzw.h"
#include "huffman.h"
#include "dirWork.h"
#include "compressor.h"

#define MAX_DEPTH 2
//TODO сделать функцию setDicLimit, которая назначала бы верхнюю планку для размера словаря перед однулением. по умолчанию - 16384
class CFileLinkerTree;

class Arch
{
	private:
		std::set<std::string> ls;
		std::vector<std::vector<std::string> > cFileLinks; //TODO засунуть это в структуру
		std::vector<std::string> cFileLinksName;
		
		int perebor(std::vector<std::vector<std::string> > & vec); //TODO delete
		
		
		void treeToVector(CFileLinkerTree* p, std::vector<CFileLinkerTree*> &vec); 
		int walkLink(int i, CFileLinkerTree* p);
		std::vector<CFileLinkerTree*> resortList(std::vector<CFileLinkerTree*>& vec);
		std::list<std::string> prepareList(std::vector<CFileLinkerTree*> &vec);
		
		CFileLinkerTree *cFLT;
		std::list<std::string> filesList;
		Compressor* compr;
		int fileType;
		std::vector<char> resetMask;
		
		void clearFilesList();
		
		int smartReset;
		int resortFilesList(std::string dirWay);
		int getFileType(const std::string& fileIn);
		int writeHeader(FILE* outputFile, std::string dirName);
		int readHeader(FILE* inputFile, std::string dirName);
	public:
		Arch();
		~Arch();
	
		int compress(std::string fileIn, std::string fileOut, char type, int _smartReset=0); // type ={h/l}
		int decompress(std::string fileIn, std::string fileOut, int type, int _smartReset=0);
};

class CFileLinkerTree
{
		std::vector<CFileLinkerTree*> pointer;
		CFileLinkerTree* daddy;
		std::string name;
		int lvl;
	public:
		CFileLinkerTree(CFileLinkerTree* _daddy, std::string _name, int _lvl) : daddy(_daddy), name(_name), lvl(_lvl), lastInResetBlock(0) {}
		~CFileLinkerTree();

		char lastInResetBlock;

		std::string getName() 	{return name;}	
		int size() 				{return pointer.size();}
		int getLvl()			{return lvl;}
		CFileLinkerTree* getDad() {return daddy;}
		
		void add(CFileLinkerTree* _daddy, std::string _name);
		CFileLinkerTree* get(int index);
};
#endif
